package com.eduspace.eduplatform.wares.utils;

import com.eduspace.eduplatform.wares.exception.ParamErrorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;

/**
 * 检测类成员的@IsCheckNull注解， 验证被标注的成员是否为空（标注于类上表示检测该类所有成员）<br>
 * 注：暂不支持标注于方法参数（2015年12月22日 09:35:18）
 *
 * @author tbc tianbencai@e-eduspace.com
 * @version 1.0 {2015年12月21日 下午5:49:44}
 */
public class CheckNullUtil {
    private static Logger log = LoggerFactory.getLogger(CheckNullUtil.class);

    /**
     * 用于对bean类型的参数进行检查，如果标注了@IsCheckNull的属性为空，则抛出参数错误异常 无异常不执行任何操作
     *
     * @param bean
     * @return
     * @author tbc tianbencai@e-eduspace.com
     * @version 1.0 {2015年12月21日 下午5:58:48}
     */
    public static void checkBeanNull(Object bean) {
        // 获取所有get方法
        Class<?> c = bean.getClass();
        // Field[] flds = c.getFields()
        Field[] flds = c.getDeclaredFields();
        if (null != flds) {
            boolean flg = false;
            if (c.getAnnotation(IsCheckNull.class) != null)
                flg = true;
            log.debug("{}", flg);
            // 关键一句，加了这句就能获取私有属性值
            Field.setAccessible(flds, true);

            for (Field it : flds) {
                // 方法是否标注@IsCheckNull
                // 未标忽略，标注的则获取值判断是否为空
                IsCheckNull check = (IsCheckNull) it.getAnnotation(IsCheckNull.class);
                if (null != check || flg) {
                    try {
                        if (it.get(bean) == null) {
                            throw new ParamErrorException("参数错误： " + it.getName() + " 不能为空");
                        } else {
                            log.info("空值检查通过 [ {} ]: {}  = ", bean.getClass().getName(), it.getName(), it.get(bean));
                        }
                    } catch (IllegalArgumentException e) {
                        log.error("IllegalArgumentException, 此异常表明向方法传递了一个不合法或不正确的参数 ");
                        log.error("Exception message : {}", e.getMessage());
                    } catch (IllegalAccessException e) {
                        log.error("IllegalAccessException, 安全权限异常，一般来说，是由于java在反射时调用了private方法所导致的");
                        log.error("Exception message : {}", e.getMessage());
                    }
                }
            }
        }
    }
}
